/*
 * dwt.c
 *
 *  Created on: 2021年11月13日
 *      Author: CameronLee
 */

#include "dwt.h"



void DWT_INIT(void)
{
	/* 使能DWT外设 */
	CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
	/* 使能Cortex-M DWT CYCCNT寄存器 */
	DWT->CTRL        |= DWT_CTRL_CYCCNTENA_Msk;
	/* DWT CYCCNT寄存器计数清0 */
	//DWT->CYCCNT =	(uint32_t)0u;
}



// 微秒延时
void DWT_Delay_us(__IO uint32_t uSec)
{
  uint32_t ticks_start, ticks_end, ticks_delay;

  ticks_start = DWT->CYCCNT;

  ticks_delay = ( uSec * ( MY_SYSCLK / (1000*1000) ) ); // 将微秒数换算成滴答数
  //一秒的节拍总数（时钟频率)/1000 000  不就是一微妙的节拍数吗

  ticks_end = ticks_start + ticks_delay;

  if ( ticks_end > ticks_start )
  {
    while( DWT->CYCCNT < ticks_end );
  }
  else // 计数溢出，翻转  有延时上限为 2^32/sysclk  超过为二次翻转并出错
  {
    while( DWT->CYCCNT >= ticks_end ); // 翻转后的值不会比ticks_end小
    while( DWT->CYCCNT < ticks_end );
  }

}
